💡 AI 인사이트

🤖 AI가 여기에 결과를 출력합니다...

댓글 커뮤니티

쿠팡이벤트

이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

검색

    로딩 중이에요... 🐣

    [코담] 웹개발·실전 프로젝트·AI까지, 파이썬·장고의 모든것을 담아낸 강의와 개발 노트

    20 포스트 수정 기능 (POST 요청으로 수정 저장) | ✅ 편저: 코담 운영자

    20강 - 포스트 수정 기능 (POST 요청으로 수정 저장)

    포스트 수정 - post api 개발


    ✨ 이번 강의 목표

    • 포스트 수정 버튼을 통해 변경된 내용을 서버에 저장
    • POST 요청 처리로 DB 반영 + 피드 페이지 리디렉션
    • 기존 이미지가 유지되는 조건 분기까지 구현

    1. 수정 요청 흐름

    수정하기 버튼 클릭
       ↓
    form(method="POST") 전송
       ↓
    post_update 뷰 함수의 POST 분기 진입
       ↓
    UpdatePostForm 으로 유효성 검증 → 저장
       ↓
    피드 페이지로 리디렉션
    

    2. 수정 뷰 함수 (POST 처리 포함)

    파일: views.py

    from django.shortcuts import render, get_object_or_404, redirect
    from django.contrib.auth.decorators import login_required
    from django.urls import reverse
    from . import models
    from .forms import UpdatePostForm
    
    @login_required
    def post_update(request, post_id):
        post = get_object_or_404(models.Post, pk=post_id)    
        if post.author != request.user:
            return redirect(reverse('users:main'))
    
        if request.method == "GET":
            form = UpdatePostForm(instance=post)
            return render(request, 'posts/post_update.html', {'form': form, 'post': post})
    
        elif request.method == "POST":
            form = UpdatePostForm(request.POST, request.FILES, instance=post)
            if form.is_valid():
                # 이미지 파일이 없는 경우 원래 이미지 유지
                if not request.FILES.get('image'):
                    form.instance.image = post.image
    
                # 변경 사항 저장
                post = form.save(commit=False)
                post.author = request.user
                post.save()
                return redirect(reverse('posts:index'))
            else:
                # 유효성 검사 실패 시 오류 메시지 전달
                return render(request, 'posts/post_update.html', {'form': form, 'post': post})
    

    ✅ 설명

    • instance=post → 기존 포스트에 덮어쓰기
    • 이미지 입력이 없을 경우 기존 이미지 유지
    • commit=False로 객체만 생성 후 작성자 재할당
    • form 에러 발생 시 기존 폼을 다시 렌더링하여 메시지 표시

    3. POST 방식 수정 처리 설명

    • 사용자가 수정 폼에서 수정하기 버튼 클릭 → POST 전송
    • UpdatePostForm(request.POST, request.FILES, instance=post)로 수정 대상 지정
    • form.is_valid() 통과 시 저장, 실패 시 에러와 함께 다시 출력

    4. 오류 메시지 처리 방법

    템플릿 내 처리:

    {{ form.non_field_errors }}         <!-- 폼 전체 오류 -->
    {{ form.caption.errors }}           <!-- caption 개별 오류 -->
    {{ form.image.errors }}             <!-- image 개별 오류 -->
    
    • 사용자가 올바르게 입력할 때까지 폼 유지 및 메시지 출력

    5. 최신 글 우선 정렬 처리 (선택적 보완)

    return Post.objects.filter(...).order_by("-created_at")
    
    • 수정 시 updated_at이 변경되더라도, 작성일(created_at) 기준으로 정렬
    • 피드에서는 최신 작성글이 위에 위치하도록 유지

    ✅ 정리

    • POST 요청으로 게시글을 실제로 수정하는 기능 구현
    • 기존 이미지 유지 조건, 작성자 확인 등 실무 필수 로직 포함
    • 유효성 검사 실패 시 오류 메시지를 포함하여 다시 폼 출력

    👉 다음 강의에서는 포스트 좋아요(Like) 기능을 구현합니다.

    TOP
    preload preload